# Our project is called 'plugin' this is how it will be called in visual studio,
# and in our makefiles.
project(plugin)

# It was noticed that when using MinGW gcc it is essential that 'core' is
# mentioned before 'base'.

# wxWidgets include (this will do all the magic to configure everything)
include("${wxWidgets_USE_FILE}")

if(MINGW)
  file(GLOB_RECURSE SRCS "*.cpp" "*.h" "*.hpp")
  list(FILTER SRCS EXCLUDE REGEX ".*/macos/.*")
  list(FILTER SRCS EXCLUDE REGEX ".*/gtk/.*")
elseif(APPLE)
  file(GLOB_RECURSE SRCS "*.cpp" "*.h" "*.hpp")
  list(FILTER SRCS EXCLUDE REGEX ".*/msw/.*")
  list(FILTER SRCS EXCLUDE REGEX ".*/gtk/.*")
else()
  file(GLOB_RECURSE SRCS "*.cpp" "*.h" "*.hpp")
  list(FILTER SRCS EXCLUDE REGEX ".*/msw/.*")
  list(FILTER SRCS EXCLUDE REGEX ".*/macos/.*")
endif()

add_library(plugin SHARED ${SRCS})

# Include paths
target_include_directories(
  plugin
  PUBLIC "${CL_SRC_ROOT}/Plugin" "${CL_SRC_ROOT}/Interfaces"
         "${CL_SRC_ROOT}/Plugin/aui"
  PRIVATE "${CL_SRC_ROOT}/submodules/yaml-cpp/include"
          "${CL_SRC_ROOT}/ThemeImporters" "${CL_SRC_ROOT}/wxTerminalCtrl")

# Macros
if(WIN32)
  target_compile_definitions(
    plugin
    PRIVATE WXMAKINGDLL_SDK
    INTERFACE WXUSINGDLL_SDK)
endif(WIN32)

if(USE_PCH AND NOT MINGW)
  add_definitions(-include "${CL_PCH_FILE}")
  add_definitions(-Winvalid-pch)
endif()

# On UNIX we require GTK
if(UNIX AND NOT APPLE)
  if(GTK_VERSION EQUAL 3)
    set(OLD_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) # Cache the current value
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
                          "${CMAKE_SOURCE_DIR}/cmake/Modules/")
    find_package(GTK3)
    set(CMAKE_MODULE_PATH ${OLD_CMAKE_MODULE_PATH}) # Reset, else the official
                                                    # path isn't used again :/
    if(GTK3_FOUND)
      include_directories(${GTK3_INCLUDE_DIRS})
    else(GTK3_FOUND)
      message(FATAL_ERROR "Could not locate GTK.")
    endif(GTK3_FOUND)
  else()
    find_package(GTK2)
    if(GTK2_FOUND)
      include_directories(${GTK2_INCLUDE_DIRS})
    else(GTK2_FOUND)
      message(FATAL_ERROR "Could not locate GTK.")
    endif(GTK2_FOUND)
  endif()

endif(UNIX AND NOT APPLE)

# Additional libraries for UNIX-like systems
set(ADDITIONAL_LIBRARIES "")

if(UNIX)
  if(IS_FREEBSD)
    set(ADDITIONAL_LIBRARIES "-lkvm -lutil")
  elseif(IS_NETBSD)
    set(ADDITIONAL_LIBRARIES "-lutil")
  elseif(UNIX AND NOT APPLE)
    set(ADDITIONAL_LIBRARIES "-ldl -lutil -lgobject-2.0")
  else()
    set(ADDITIONAL_LIBRARIES "-ldl")
  endif()
elseif(WIN32)
  set(ADDITIONAL_LIBRARIES "-luxtheme")
endif()

# Add RPATH
if(NOT MINGW AND WXC_APP)
  string(REPLACE "codelite" "wxcrafter" WXC_LIBS_DIR ${PLUGINS_DIR})
  set(LINKER_OPTIONS -Wl,-rpath,"${WXC_LIBS_DIR}")
  message("-- libplugin.so is using RPATH set to ${WXC_LIBS_DIR}")
endif()

if(UNIX OR APPLE)
  set_target_properties(plugin PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()

target_link_libraries(
  plugin
  ${LINKER_OPTIONS}
  ${ADDITIONAL_LIBRARIES}
  ${GTK3_LIBRARIES}
  ${LIBYAML_CPP}
  -L"${CL_LIBPATH}"
  lexers_extra
  libcodelite
  lualib
  LuaBridge)

if(USE_PCH)
  codelite_add_pch(plugin)
endif()

if(NOT MINGW)
  if(APPLE)
    install(TARGETS plugin
            DESTINATION ${CMAKE_BINARY_DIR}/codelite.app/Contents/MacOS/)
  else()
    install(TARGETS plugin DESTINATION ${PLUGINS_DIR})
  endif()
else()
  install(
    TARGETS plugin
    RUNTIME DESTINATION ${CL_INSTALL_BIN}
    LIBRARY DESTINATION ${CL_INSTALL_BIN}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
endif()
